'use strict'

import {app, protocol, BrowserWindow, ipcMain} from 'electron'
import {autoUpdater} from 'electron-updater'
import {createProtocol} from 'vue-cli-plugin-electron-builder/lib'
import * as path from "path";
// import installExtension, {VUEJS3_DEVTOOLS} from 'electron-devtools-installer'
let win: BrowserWindow
const isDevelopment = process.env.NODE_ENV !== 'production'

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
    {scheme: 'app', privileges: {secure: true, standard: true}}
])

interface UpdateConfig {
    download: string
}

function updateHandle(updateConfig: UpdateConfig) {
    const message = {
        error: {
            message: 'error',
            data: {}
        },
        checking: {
            message: 'checking'
        },
        updateAva: {
            message: 'downloading'
        },
        updateNotAva: {
            message: 'not'
        },
        down:{
            message: 'down'
        }
    }

    autoUpdater.setFeedURL({
        provider: 'generic',
        url: updateConfig.download
    })

    autoUpdater.on('error', function (error) {
        message.error.data = error
        sendUpdateMessage(message.error)
    })
    autoUpdater.on('checking-for-update', function () {
        sendUpdateMessage(message.checking)
    })
    // 版本检测结束，准备更新
    autoUpdater.on('update-available', function (info) {
        sendUpdateMessage(message.updateAva)
    })
    autoUpdater.on('update-not-available', function (info) {
        sendUpdateMessage(message.updateNotAva)
    })
    autoUpdater.on('download-progress', function (progressObj) {
        // console.log('下载进度百分比>>>', progressObj.percent)
        sendDProgress(progressObj.percent)
    })
    // 下载完成
    autoUpdater.on('update-downloaded', function () {
        // 退出且重新安装
        sendUpdateMessage(message.down)
    })
    ipcMain.on('checkForUpdate', () => {
        // 执行自动更新检查
        autoUpdater.checkForUpdates()
    })

    ipcMain.on('start-install',()=>{
        autoUpdater.quitAndInstall()
    })
}

function sendUpdateMessage(text: any) {
    win.webContents.send('updateMessage', text)
}

function sendDProgress(data: any) {
    win.webContents.send('progress', data)
}

export default updateHandle

async function createWindow() {
    // Create the browser window.
    win = new BrowserWindow({
        width: 1400,
        height: 800,
        webPreferences: {

            // Use pluginOptions.nodeIntegration, leave this alone
            // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
            nodeIntegration: (process.env
                .ELECTRON_NODE_INTEGRATION as unknown) as boolean,
            contextIsolation: true,
            preload: path.join(__filename, '..', 'preload.js'),
            webSecurity: false
        },
        frame: false,
        resizable: false,
        maximizable: false
    })
    win.setMenu(null)
    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string)
        if (!process.env.IS_TEST) win.webContents.openDevTools({mode: "detach"})

    } else {
        createProtocol('app')
        // Load the index.html when not in development
        win.loadURL('app://./index.html')
        // win.webContents.openDevTools({mode: "detach"})

    }
}

// Quit when all windows are closed.
app.on('window-all-closed', () => {
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

app.on('activate', () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        // Install Vue Devtools
        try {
            // await installExtension(VUEJS3_DEVTOOLS)
        } catch (e: any) {
            console.error('Vue Devtools failed to install:', e.toString())
        }
    }
    createWindow()
})


ipcMain.on("winClose", () => {
    app.exit(0)
})
ipcMain.on('winMin', () => {
    if (win) {
        win.minimize()
    }
})
// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === 'win32') {
        process.on('message', (data) => {
            if (data === 'graceful-exit') {
                app.quit()
            }
        })
    } else {
        process.on('SIGTERM', () => {
            app.quit()
        })
    }
}
updateHandle({
    download: 'http://101.42.31.19:8090'
})
